package br.com.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

import br.com.dominio.CPU;
import br.com.dominio.Node;

/**
 * A classe Conexão é responsável por abrir uma conexão com o servidor do
 * banco de dados. </br>
 * Sempre que uma classe precisar trocar informação com o banco de dados,
 * uma sessão deve ser iniciada e pega por: </br>
 * </br> <code>new Conexão().{@link #getSession()}</code>. </br></br>Nesta
 * classe é passado
 * a configuração do Hibernate através do arquivo {@link config
 * config/hibernate.cfg.xml} , arquivo este que é responsável pelo mapeamento
 * das classes de domínio.
 * 
 * @see CPU
 * @see Node
 * @author Adam
 * @since 30/07/2014
 * @see Session
 * @see SessionFactory
 */
public class Conexão {

	private static Session sessão;
	private static SessionFactory fábricaDeSessões;

	/**
	 * O construtor padrão de Conexão inicia uma conexão caso não haja nenhuma
	 * aberta. </br>
	 * Sempre que uma classe precisar trocar informação com o banco de dados,
	 * uma sessão deve ser iniciada e pega por: </br>
	 * </br> <code>new Conexão().{@link #getSession()}</code>
	 * 
	 * @author Adam
	 * @since 30/07/2014
	 * @see Session
	 * @see SessionFactory
	 */
	public Conexão() {

		// 1 - Configuration
		if (sessão == null) {
			System.out.println("Conexão >> Sessão aberta com sucesso.");
			Configuration configuracao = new Configuration();

			// 2- SessionFactory

			// 2.2) Passar o arquivo de configuracao da interface Hibernate X
			// JDBC
			configuracao.configure("config/hibernate.cfg.xml");

			// 2.4) Instanciando um construtor para um Registrador de Servico
			// padrao
			ServiceRegistry construtorRegistro =
					new StandardServiceRegistryBuilder().applySettings(
							configuracao.getProperties()).build();

			// 2.5) Pegando uma SessionFactory. Não precisa instanciar
			fábricaDeSessões = configuracao.buildSessionFactory(construtorRegistro);

			// 3 - Session
			sessão = fábricaDeSessões.openSession();
		}
		else {

			System.out.println("Conexão >> Já existe conexão aberta");
			System.out
					.println("------------------------------------------------------------");

		}

	}

	/**
	 * Método que retorna a sessão aberta com o banco de dados.
	 * 
	 * @return {@link Session}
	 * @author Adam
	 * @since 30/07/2014
	 */
	public Session getSession() {
		return sessão;

	}

	/**
	 * Método que retorna a fábrica de sessões com o servidor de banco de dados.
	 * 
	 * @return {@link SessionFactory}
	 * @author Adam
	 * @since 30/07/2014
	 */
	public SessionFactory getSessoesFabricadas() {
		return fábricaDeSessões;
	}

}
